home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Viewers / aMiPEG_1.0 / src / analysis.h next >
Text File  |  1998-06-24  |  14KB  |  391 lines

  1. unsigned int bitCount = 0;
  2.  
  3. int showmb_flag = 0;
  4. int showEachFlag = 0;
  5.  
  6. typedef struct {
  7.   int frametype;
  8.   unsigned int totsize;
  9.   unsigned int number;
  10.   unsigned int i_mbsize;
  11.   unsigned int p_mbsize;
  12.   unsigned int b_mbsize;
  13.   unsigned int bi_mbsize;
  14.   unsigned int i_mbnum;
  15.   unsigned int p_mbnum;
  16.   unsigned int b_mbnum;
  17.   unsigned int bi_mbnum;
  18.   unsigned int i_mbcbp[64];
  19.   unsigned int p_mbcbp[64];
  20.   unsigned int b_mbcbp[64];
  21.   unsigned int bi_mbcbp[64];
  22.   unsigned int i_mbcoeff[64];
  23.   unsigned int p_mbcoeff[64];
  24.   unsigned int b_mbcoeff[64];
  25.   unsigned int bi_mbcoeff[64];
  26.   double tottime;
  27. } Statval;
  28.  
  29. Statval stat_a[4];
  30. unsigned int pictureSizeCount;
  31. unsigned int mbSizeCount;
  32. unsigned int *mbCBPPtr, *mbCoeffPtr, *mbSizePtr;
  33. unsigned int cacheHit[8][8], cacheMiss[8][8];
  34.  
  35.  
  36.  
  37. static void init_stat_struct(Statval *astat)
  38. {
  39.   int j;
  40.  
  41.   astat->frametype = 0;
  42.   astat->totsize = 0;
  43.   astat->number = 0;
  44.   astat->i_mbsize = 0;
  45.   astat->p_mbsize = 0;
  46.   astat->b_mbsize = 0;
  47.   astat->bi_mbsize = 0;
  48.   astat->i_mbnum = 0;
  49.   astat->p_mbnum = 0;
  50.   astat->b_mbnum = 0;
  51.   astat->bi_mbnum = 0;
  52.  
  53.   for (j = 0; j < 64; j++) {
  54.  
  55.     astat->i_mbcbp[j] = 0;
  56.     astat->p_mbcbp[j] = 0;
  57.     astat->b_mbcbp[j] = 0;
  58.     astat->bi_mbcbp[j] = 0;
  59.     astat->i_mbcoeff[j] = 0;
  60.     astat->p_mbcoeff[j] = 0;
  61.     astat->b_mbcoeff[j] = 0;
  62.     astat->bi_mbcoeff[j] = 0;
  63.   }
  64.   astat->tottime = 0.0;
  65. }
  66.  
  67. void init_stats(void)
  68. {
  69.   int i, j;
  70.  
  71.   for (i = 0; i < 4; i++) {
  72.     init_stat_struct(&(stat_a[i]));
  73.     stat_a[i].frametype = i;
  74.   }
  75.  
  76.   for (i = 0; i < 8; i++) {
  77.     for (j = 0; j < 8; j++) {
  78.       cacheHit[i][j] = 0;
  79.       cacheMiss[i][j] = 0;
  80.     }
  81.   }
  82.  
  83.   bitCount = 0;
  84. }
  85.  
  86. static void PrintOneStat(void)
  87. {
  88.   int i;
  89.  
  90.   printf("\n");
  91.   switch (stat_a[0].frametype) {
  92.   case I_TYPE:
  93.     printf("I FRAME\n");
  94.     break;
  95.   case P_TYPE:
  96.     printf("P FRAME\n");
  97.     break;
  98.   case B_TYPE:
  99.     printf("B FRAME\n");
  100.     break;
  101.   }
  102.  
  103.   printf("Size: %d bytes + %d bits\n", stat_a[0].totsize / 8, stat_a[0].totsize % 8);
  104.   if (stat_a[0].i_mbnum > 0) {
  105.     printf("\tI Macro Block Stats:\n");
  106.     printf("\t%d I Macroblocks\n", stat_a[0].i_mbnum);
  107.     printf("\tAvg. Size: %d bytes + %d bits\n",
  108.        stat_a[0].i_mbsize / (8 * stat_a[0].i_mbnum),
  109.        (stat_a[0].i_mbsize * stat_a[0].i_mbnum) % 8);
  110.     printf("\t\tCoded Block Pattern Histogram:\n");
  111.     for (i = 0; i < 64; i += 8) {
  112.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].i_mbcbp[i],
  113.          stat_a[0].i_mbcbp[i + 1], stat_a[0].i_mbcbp[i + 2], stat_a[0].i_mbcbp[i + 3],
  114.          stat_a[0].i_mbcbp[i + 4], stat_a[0].i_mbcbp[i + 5], stat_a[0].i_mbcbp[i + 6],
  115.          stat_a[0].i_mbcbp[i + 7]);
  116.     }
  117.     printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  118.     for (i = 0; i < 64; i += 8) {
  119.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].i_mbcoeff[i],
  120.          stat_a[0].i_mbcoeff[i + 1], stat_a[0].i_mbcoeff[i + 2],
  121.          stat_a[0].i_mbcoeff[i + 3], stat_a[0].i_mbcoeff[i + 4],
  122.          stat_a[0].i_mbcoeff[i + 5], stat_a[0].i_mbcoeff[i + 6],
  123.          stat_a[0].i_mbcoeff[i + 7]);
  124.     }
  125.   }
  126.   if (stat_a[0].p_mbnum > 0) {
  127.     printf("\tP Macro Block Stats:\n");
  128.     printf("\t%d P Macroblocks\n", stat_a[0].p_mbnum);
  129.     printf("\tAvg. Size: %d bytes + %d bits\n",
  130.        stat_a[0].p_mbsize / (8 * stat_a[0].p_mbnum),
  131.        (stat_a[0].p_mbsize / stat_a[0].p_mbnum) % 8);
  132.     printf("\t\tCoded Block Pattern Histogram:\n");
  133.     for (i = 0; i < 64; i += 8) {
  134.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].p_mbcbp[i],
  135.          stat_a[0].p_mbcbp[i + 1], stat_a[0].p_mbcbp[i + 2], stat_a[0].p_mbcbp[i + 3],
  136.          stat_a[0].p_mbcbp[i + 4], stat_a[0].p_mbcbp[i + 5], stat_a[0].p_mbcbp[i + 6],
  137.          stat_a[0].p_mbcbp[i + 7]);
  138.     }
  139.     printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  140.     for (i = 0; i < 64; i += 8) {
  141.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].p_mbcoeff[i],
  142.          stat_a[0].p_mbcoeff[i + 1], stat_a[0].p_mbcoeff[i + 2],
  143.          stat_a[0].p_mbcoeff[i + 3], stat_a[0].p_mbcoeff[i + 4],
  144.          stat_a[0].p_mbcoeff[i + 5], stat_a[0].p_mbcoeff[i + 6],
  145.          stat_a[0].p_mbcoeff[i + 7]);
  146.     }
  147.   }
  148.   if (stat_a[0].b_mbnum > 0) {
  149.     printf("\tB Macro Block Stats:\n");
  150.     printf("\t%d B Macroblocks\n", stat_a[0].b_mbnum);
  151.     printf("\tAvg. Size: %d bytes + %d bits\n",
  152.        stat_a[0].b_mbsize / (8 * stat_a[0].b_mbnum),
  153.        (stat_a[0].b_mbsize / stat_a[0].b_mbnum) % 8);
  154.     printf("\t\tCoded Block Pattern Histogram:\n");
  155.     for (i = 0; i < 64; i += 8) {
  156.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].b_mbcbp[i],
  157.          stat_a[0].b_mbcbp[i + 1], stat_a[0].b_mbcbp[i + 2], stat_a[0].b_mbcbp[i + 3],
  158.          stat_a[0].b_mbcbp[i + 4], stat_a[0].b_mbcbp[i + 5], stat_a[0].b_mbcbp[i + 6],
  159.          stat_a[0].b_mbcbp[i + 7]);
  160.     }
  161.     printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  162.     for (i = 0; i < 64; i += 8) {
  163.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].b_mbcoeff[i],
  164.          stat_a[0].b_mbcoeff[i + 1], stat_a[0].b_mbcoeff[i + 2],
  165.          stat_a[0].b_mbcoeff[i + 3], stat_a[0].b_mbcoeff[i + 4],
  166.          stat_a[0].b_mbcoeff[i + 5], stat_a[0].b_mbcoeff[i + 6],
  167.          stat_a[0].b_mbcoeff[i + 7]);
  168.     }
  169.   }
  170.   if (stat_a[0].bi_mbnum > 0) {
  171.     printf("\tBi Macro Block Stats:\n");
  172.     printf("\t%d Bi Macroblocks\n", stat_a[0].bi_mbnum);
  173.     printf("\tAvg. Size: %d bytes + %d bits\n",
  174.        stat_a[0].bi_mbsize / (8 * stat_a[0].bi_mbnum),
  175.        (stat_a[0].bi_mbsize * stat_a[0].bi_mbnum) % 8);
  176.     printf("\t\tCoded Block Pattern Histogram:\n");
  177.     for (i = 0; i < 64; i += 8) {
  178.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].bi_mbcbp[i],
  179.          stat_a[0].bi_mbcbp[i + 1], stat_a[0].bi_mbcbp[i + 2], stat_a[0].bi_mbcbp[i + 3],
  180.          stat_a[0].bi_mbcbp[i + 4], stat_a[0].bi_mbcbp[i + 5], stat_a[0].bi_mbcbp[i + 6],
  181.          stat_a[0].bi_mbcbp[i + 7]);
  182.     }
  183.     printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  184.     for (i = 0; i < 64; i += 8) {
  185.       printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[0].bi_mbcoeff[i],
  186.          stat_a[0].bi_mbcoeff[i + 1], stat_a[0].bi_mbcoeff[i + 2],
  187.          stat_a[0].bi_mbcoeff[i + 3], stat_a[0].bi_mbcoeff[i + 4],
  188.          stat_a[0].bi_mbcoeff[i + 5], stat_a[0].bi_mbcoeff[i + 6],
  189.          stat_a[0].bi_mbcoeff[i + 7]);
  190.     }
  191.   }
  192.   printf("\nTime to Decode: %g secs.\n", stat_a[0].tottime);
  193.   printf("****************\n");
  194. }
  195.  
  196. void PrintAllStats(void)
  197. {
  198.   int i, j;
  199.   unsigned int supertot, supernum;
  200.   double supertime;
  201.  
  202.   printf("\n");
  203.   printf("General Info: \n");
  204.   printf("Width: %d\nHeight: %d\n", curVidStream->mb_width * 16, curVidStream->mb_height * 16);
  205.  
  206.   for (i = 1; i < 4; i++) {
  207.  
  208.     if (stat_a[i].number == 0)
  209.       continue;
  210.  
  211.     switch (i) {
  212.     case 1:
  213.       printf("I FRAMES\n");
  214.       break;
  215.     case 2:
  216.       printf("P FRAMES\n");
  217.       break;
  218.     case 3:
  219.       printf("B FRAMES\n");
  220.       break;
  221.     }
  222.  
  223.     printf("Number: %d\n", stat_a[i].number);
  224.     printf("Avg. Size: %d bytes + %d bits\n",
  225.        stat_a[i].totsize / (8 * stat_a[i].number), (stat_a[i].totsize / stat_a[i].number) % 8);
  226.     if (stat_a[i].i_mbnum > 0) {
  227.       printf("\tI Macro Block Stats:\n");
  228.       printf("\t%d I Macroblocks\n", stat_a[i].i_mbnum);
  229.       printf("\tAvg. Size: %d bytes + %d bits\n",
  230.          stat_a[i].i_mbsize / (8 * stat_a[i].i_mbnum),
  231.          (stat_a[i].i_mbsize / stat_a[i].i_mbnum) % 8);
  232.       printf("\t\tCoded Block Pattern Histogram:\n");
  233.       for (j = 0; j < 64; j += 8) {
  234.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].i_mbcbp[j],
  235.            stat_a[i].i_mbcbp[j + 1], stat_a[i].i_mbcbp[j + 2], stat_a[i].i_mbcbp[j + 3],
  236.            stat_a[i].i_mbcbp[j + 4], stat_a[i].i_mbcbp[j + 5], stat_a[i].i_mbcbp[j + 6],
  237.            stat_a[i].i_mbcbp[j + 7]);
  238.       }
  239.       printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  240.       for (j = 0; j < 64; j += 8) {
  241.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].i_mbcoeff[j],
  242.            stat_a[i].i_mbcoeff[j + 1], stat_a[i].i_mbcoeff[j + 2],
  243.            stat_a[i].i_mbcoeff[j + 3], stat_a[i].i_mbcoeff[j + 4],
  244.            stat_a[i].i_mbcoeff[j + 5], stat_a[i].i_mbcoeff[j + 6],
  245.            stat_a[i].i_mbcoeff[j + 7]);
  246.       }
  247.     }
  248.     if (stat_a[i].p_mbnum > 0) {
  249.       printf("\tP Macro Block Stats:\n");
  250.       printf("\t%d P Macroblocks\n", stat_a[i].p_mbnum);
  251.       printf("\tAvg. Size: %d bytes + %d bits\n",
  252.          stat_a[i].p_mbsize / (8 * stat_a[i].p_mbnum),
  253.          (stat_a[i].p_mbsize / stat_a[i].p_mbnum) % 8);
  254.       printf("\t\tCoded Block Pattern Histogram:\n");
  255.       for (j = 0; j < 64; j += 8) {
  256.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].p_mbcbp[j],
  257.            stat_a[i].p_mbcbp[j + 1], stat_a[i].p_mbcbp[j + 2], stat_a[i].p_mbcbp[j + 3],
  258.            stat_a[i].p_mbcbp[j + 4], stat_a[i].p_mbcbp[j + 5], stat_a[i].p_mbcbp[j + 6],
  259.            stat_a[i].p_mbcbp[j + 7]);
  260.       }
  261.       printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  262.       for (j = 0; j < 64; j += 8) {
  263.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].p_mbcoeff[j],
  264.            stat_a[i].p_mbcoeff[j + 1], stat_a[i].p_mbcoeff[j + 2],
  265.            stat_a[i].p_mbcoeff[j + 3], stat_a[i].p_mbcoeff[j + 4],
  266.            stat_a[i].p_mbcoeff[j + 5], stat_a[i].p_mbcoeff[j + 6],
  267.            stat_a[i].p_mbcoeff[j + 7]);
  268.       }
  269.     }
  270.     if (stat_a[i].b_mbnum > 0) {
  271.       printf("\tB Macro Block Stats:\n");
  272.       printf("\t%d B Macroblocks\n", stat_a[i].b_mbnum);
  273.       printf("\tAvg. Size: %d bytes + %d bits\n",
  274.          stat_a[i].b_mbsize / (8 * stat_a[i].b_mbnum),
  275.          (stat_a[i].b_mbsize * stat_a[i].b_mbnum) % 8);
  276.       printf("\t\tCoded Block Pattern Histogram:\n");
  277.       for (j = 0; j < 64; j += 8) {
  278.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].b_mbcbp[j],
  279.            stat_a[i].b_mbcbp[j + 1], stat_a[i].b_mbcbp[j + 2], stat_a[i].b_mbcbp[j + 3],
  280.            stat_a[i].b_mbcbp[j + 4], stat_a[i].b_mbcbp[j + 5], stat_a[i].b_mbcbp[j + 6],
  281.            stat_a[i].b_mbcbp[j + 7]);
  282.       }
  283.       printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  284.       for (j = 0; j < 64; j += 8) {
  285.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].b_mbcoeff[j],
  286.            stat_a[i].b_mbcoeff[j + 1], stat_a[i].b_mbcoeff[j + 2],
  287.            stat_a[i].b_mbcoeff[j + 3], stat_a[i].b_mbcoeff[j + 4],
  288.            stat_a[i].b_mbcoeff[j + 5], stat_a[i].b_mbcoeff[j + 6],
  289.            stat_a[i].b_mbcoeff[j + 7]);
  290.       }
  291.     }
  292.     if (stat_a[i].bi_mbnum > 0) {
  293.       printf("\tBi Macro Block Stats:\n");
  294.       printf("\t%d Bi Macroblocks\n", stat_a[i].bi_mbnum);
  295.       printf("\tAvg. Size: %d bytes + %d bits\n",
  296.          stat_a[i].bi_mbsize / (8 * stat_a[i].bi_mbnum),
  297.          (stat_a[i].bi_mbsize * stat_a[i].bi_mbnum) % 8);
  298.       printf("\t\tCoded Block Pattern Histogram:\n");
  299.       for (j = 0; j < 64; j += 8) {
  300.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].bi_mbcbp[j],
  301.            stat_a[i].bi_mbcbp[j + 1], stat_a[i].bi_mbcbp[j + 2], stat_a[i].bi_mbcbp[j + 3],
  302.            stat_a[i].bi_mbcbp[j + 4], stat_a[i].bi_mbcbp[j + 5], stat_a[i].bi_mbcbp[j + 6],
  303.            stat_a[i].bi_mbcbp[j + 7]);
  304.       }
  305.       printf("\n\t\tNumber of Coefficients/Block Histogram:\n");
  306.       for (j = 0; j < 64; j += 8) {
  307.     printf("\t%.6d %.6d %.6d %.6d %.6d %.6d %.6d %.6d\n", stat_a[i].bi_mbcoeff[j],
  308.            stat_a[i].bi_mbcoeff[j + 1], stat_a[i].bi_mbcoeff[j + 2],
  309.            stat_a[i].bi_mbcoeff[j + 3], stat_a[i].bi_mbcoeff[j + 4],
  310.            stat_a[i].bi_mbcoeff[j + 5], stat_a[i].bi_mbcoeff[j + 6],
  311.            stat_a[i].bi_mbcoeff[j + 7]);
  312.       }
  313.     }
  314.     printf("\nAvg. Time to Decode: %f secs.\n",
  315.        (stat_a[i].tottime / ((double) stat_a[i].number)));
  316.     printf("\n");
  317.     printf("*************************\n\n");
  318.   }
  319.  
  320.   supertot = stat_a[1].totsize + stat_a[2].totsize + stat_a[3].totsize;
  321.   supernum = stat_a[1].number + stat_a[2].number + stat_a[3].number;
  322.   supertime = stat_a[1].tottime + stat_a[2].tottime + stat_a[3].tottime;
  323.  
  324.   printf("Total Number of Frames: %d\n", supernum);
  325.   printf("Avg Frame Size: %d bytes %d bits\n",
  326.      supertot / (8 * supernum), (supertot / supernum) % 8);
  327.   printf("Total Time Decoding: %g secs.\n", supertime);
  328.   printf("Avg Decoding Time/Frame: %g secs.\n", supertime / ((double) supernum));
  329.   printf("Avg Decoding Frames/Sec: %g secs.\n", ((double) supernum) / supertime);
  330.   printf("\n");
  331.  
  332.   printf("Cache Hits/Miss\n");
  333.   for (i = 0; i < 8; i++) {
  334.     printf("%.6d/%.6d\t%.6d/%.6d\t%.6d/%.6d\t%.6d/%.6d\n",
  335.        cacheHit[i][0], cacheMiss[i][0], cacheHit[i][1], cacheMiss[i][1],
  336.        cacheHit[i][2], cacheMiss[i][2], cacheHit[i][3], cacheMiss[i][3]);
  337.     printf("%.6d/%.6d\t%.6d/%.6d\t%.6d/%.6d\t%.6d/%.6d\n",
  338.        cacheHit[i][4], cacheMiss[i][4], cacheHit[i][5], cacheMiss[i][5],
  339.        cacheHit[i][6], cacheMiss[i][6], cacheHit[i][7], cacheMiss[i][7]);
  340.   }
  341. }
  342.  
  343. static void CollectStats(void)
  344. {
  345.   int i, j;
  346.  
  347.   i = stat_a[0].frametype;
  348.  
  349.   stat_a[i].totsize += stat_a[0].totsize;
  350.   stat_a[i].number += stat_a[0].number;
  351.   stat_a[i].i_mbsize += stat_a[0].i_mbsize;
  352.   stat_a[i].p_mbsize += stat_a[0].p_mbsize;
  353.   stat_a[i].b_mbsize += stat_a[0].b_mbsize;
  354.   stat_a[i].bi_mbsize += stat_a[0].bi_mbsize;
  355.   stat_a[i].i_mbnum += stat_a[0].i_mbnum;
  356.   stat_a[i].p_mbnum += stat_a[0].p_mbnum;
  357.   stat_a[i].b_mbnum += stat_a[0].b_mbnum;
  358.   stat_a[i].bi_mbnum += stat_a[0].bi_mbnum;
  359.  
  360.   for (j = 0; j < 64; j++) {
  361.  
  362.     stat_a[i].i_mbcbp[j] += stat_a[0].i_mbcbp[j];
  363.     stat_a[i].p_mbcbp[j] += stat_a[0].p_mbcbp[j];
  364.     stat_a[i].b_mbcbp[j] += stat_a[0].b_mbcbp[j];
  365.     stat_a[i].bi_mbcbp[j] += stat_a[0].bi_mbcbp[j];
  366.     stat_a[i].i_mbcoeff[j] += stat_a[0].i_mbcoeff[j];
  367.     stat_a[i].p_mbcoeff[j] += stat_a[0].p_mbcoeff[j];
  368.     stat_a[i].b_mbcoeff[j] += stat_a[0].b_mbcoeff[j];
  369.     stat_a[i].bi_mbcoeff[j] += stat_a[0].bi_mbcoeff[j];
  370.   }
  371.  
  372.   stat_a[i].tottime += stat_a[0].tottime;
  373.  
  374.   init_stat_struct(&(stat_a[0]));
  375. }
  376.  
  377. static unsigned int bitCountRead(void)
  378. {
  379.   return bitCount;
  380. }
  381.  
  382. static void StartTime(void)
  383. {
  384.   stat_a[0].tottime = ReadSysClock();
  385. }
  386.  
  387. static void EndTime(void)
  388. {
  389.   stat_a[0].tottime = ReadSysClock() - stat_a[0].tottime;
  390. }
  391.